﻿using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data.Entity;
using System.Globalization;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Business;
using Microsoft.AspNet.SignalR;

public partial class Details : System.Web.UI.Page
{
    protected Utilities utilities = new Utilities();
    Utilities.Times allowedTimes = new Utilities.Times();
    ScheduleUtilities scheduleUtilities = new ScheduleUtilities();
    CalendarUtilities calendarUtilities = new CalendarUtilities();
    string defaultRoom;
    protected DateTime currentDate;
    protected int roomId;
    string currentBookingId = "";

    protected ScheduleUtilities.BookingDetails bookingDetails = new ScheduleUtilities.BookingDetails();
    protected AlertMessage.MessageData alertMessageData = new AlertMessage.MessageData();

    protected void Page_Load(object sender, EventArgs e)
    {
        // Sätter lägsta och högsta tid för bokning. Hämtas från web.config > appSettings
        allowedTimes.minTime = Convert.ToInt32(ConfigurationManager.AppSettings["timeStart"]);
        allowedTimes.maxTime = Convert.ToInt32(ConfigurationManager.AppSettings["timeEnd"]);
        defaultRoom = utilities.DefaultRoomRedirectExists(Request.QueryString["def"]);
        currentBookingId = Request.QueryString["bookingID"];
        delId.Value = currentBookingId;

        // Message-check
        alertMessageData = AlertMessage.OutputAlertMessage(Request.QueryString["m"]);

        // Bestämmer vilken dag som skall visas
        currentDate = DateHandler.CheckStringForDate(Request.QueryString["d"]);

        // Hanterar rumnavigationen
        roomId = Utilities.CheckStringForRoom(Request.QueryString["r"]);
        roomNav.InnerHtml += utilities.GetRoomHtml(roomId, currentDate, defaultRoom);

        // Kollar om det finns någon bokning med det ID användaren står på
        CheckCurrentBookingIdForMatches();

        // Skriver ut värden i kontroller
        PrepareDataControls();

        // När vi tar bort en bokning
        if (Request.Form["delId"] != null)
        {
            DeleteBooking();
        }

        // När användaren försöker redigera en bokning
        if (Request.Form["editId"] != null)
        {
            EditBooking();
        }

        // När användaren lägger till en bokning
        if (Request.Form["hiddenBooking"] == "1")
        {
            CompleteBooking();
        }

        bookings.InnerHtml = scheduleUtilities.GetBookingBoxHtml(currentDate, roomId, allowedTimes, defaultRoom);

        var lastRef = roomId + defaultRoom;
        todayLink.HRef = string.Format("Default.aspx?d={0:yyyy-MM-dd}&r={1}", currentDate, lastRef);

        CheckHomeDestination();
    }

    // Skickar tillbaka besökaren efter 5 minuter
    protected void CheckHomeDestination()
    {
        if (!string.IsNullOrEmpty(defaultRoom))
        {
            Response.AddHeader("REFRESH", "300;URL=?d=" + DateTime.Today.ToString("yyyy-MM-dd") + "&r=" + defaultRoom + "&def=" + defaultRoom);
        }
    }

    // BookingDetails tar hand om en enskild bokning
    // Om det inte finns något bookingID så kollar vi efter ett safeID
    protected void CheckCurrentBookingIdForMatches()
    { 
        if (!string.IsNullOrEmpty(currentBookingId))
        {
            bookingDetails = scheduleUtilities.DetailsOfBooking(currentBookingId);
        }
        else if (!string.IsNullOrEmpty(Request.QueryString["safeID"]))
        {
            bookingDetails = scheduleUtilities.DetailsOfBooking(Request.QueryString["safeID"]);
        }

        // Om vi har en aktiv bokning skrivs allting ut
        if (bookingDetails != null)
        {
            // Sätter attribut på länken som öppnar en JS-ruta och sätter värdet därefter. (js/modalCust.js)
            editLink.Attributes.Add("data-id", bookingDetails.id.ToString());
            editLink.Attributes.Add("data-start", utilities.CalculateTime(bookingDetails.bookingFrom.ToString("HH:mm")).ToString());
            editLink.Attributes.Add("data-end", utilities.CalculateTime(bookingDetails.bookingTo.ToString("HH:mm")).ToString());

            editId.Value = bookingDetails.id.ToString();
            messageToEdit.InnerText = bookingDetails.message;
        }

        // Om vi inte har någon bokning så skall ej redigera- och ta bort-knappen visas
        else
        {
            editLink.Visible = false;
            deleteLink.Visible = false;
        }
    }

    // Skriver ut en rad för varje timme i allowedTimes
    // Tiderna läggs även till med hel- och halvtimme i bokningsrutan som tidsalternativ för bokning
    protected void PrepareDataControls()
    {
        scheduleUtilities.FillTimeListDropDown(ddFrom, allowedTimes);
        scheduleUtilities.FillTimeListDropDown(ddTo, allowedTimes);
        scheduleUtilities.FillTimeListDropDown(ddFromEdit, allowedTimes);
        scheduleUtilities.FillTimeListDropDown(ddToEdit, allowedTimes);

        scheduleUtilities.FillNameListDropDown(ddName);

        scheduleRepeater.DataSource = scheduleUtilities.FillSchedule(allowedTimes);
        scheduleRepeater.DataBind();
    }

    protected void DeleteBooking()
    {
        int idOfBooking = Convert.ToInt32(Request.Form["delId"]);

        if (!string.IsNullOrEmpty(Request.Form["pinCode"]))
        {
            // En check görs för att kolla så PIN-koden stämmer
            if (utilities.CheckPinCodeForBooking(Request.Form["pinCode"], idOfBooking))
            {
                Response.Redirect("Default.aspx" + calendarUtilities.DeleteBooking(idOfBooking, currentDate, roomId) + utilities.DefaultRoomRedirectExists(defaultRoom));
            }
            else
            {
                // Om det är > 1a gången användaren slår in fel så skickas man bara till samma
                if (Request.QueryString["m"] != "wrongPin")
                    Response.Redirect(HttpContext.Current.Request.Url.AbsoluteUri + "&m=wrongPin");
                else
                    Response.Redirect(HttpContext.Current.Request.Url.AbsoluteUri);
            }
        }
        else
        {
            // Om det är > 1a gången användaren slår in fel så skickas man bara till samma
            if (Request.QueryString["m"] != "wrongPin")
                Response.Redirect(HttpContext.Current.Request.Url.AbsoluteUri + "&m=wrongPin");
            else
                Response.Redirect(HttpContext.Current.Request.Url.AbsoluteUri);
        }
    }

    protected void EditBooking()
    {
        int idOfBooking = Convert.ToInt32(Request.Form["editId"]);

        if (!string.IsNullOrEmpty(Request.Form["pinCode"]))
        {
            // En check görs för att kolla så PIN-koden stämmer
            if (utilities.CheckPinCodeForBooking(Request.Form["pinCode"], idOfBooking))
            {
                double from = utilities.CalculateTime(Request.Form["tBoxFromEdit"]);
                double to = utilities.CalculateTime(Request.Form["tBoxToEdit"]);
                string message = Request.Form["messageToEdit"];

                DateTime timeFrom = currentDate.AddHours(from);
                DateTime timeTo = currentDate.AddHours(to);
                Response.Redirect("Details.aspx" + calendarUtilities.UpdateBooking(currentDate, idOfBooking, timeFrom, timeTo, roomId, message) + utilities.DefaultRoomRedirectExists(defaultRoom));
            }
            else
            {
                // Om det är > 1a gången användaren slår in fel så skickas man bara till samma
                if (Request.QueryString["m"] != "wrongPin")
                    Response.Redirect(HttpContext.Current.Request.Url.AbsoluteUri + "&m=wrongPin");
                else
                    Response.Redirect(HttpContext.Current.Request.Url.AbsoluteUri);
            }
        }
        else
        {
            // Om det är > 1a gången användaren slår in fel så skickas man bara till samma
            if (Request.QueryString["m"] != "wrongPin")
                Response.Redirect(HttpContext.Current.Request.Url.AbsoluteUri + "&m=wrongPin");
            else
                Response.Redirect(HttpContext.Current.Request.Url.AbsoluteUri);
        }
    }

    protected void CompleteBooking()
    {
        // Hämtar alla värden från formuläret
        double from = utilities.CalculateTime(Request.Form["tBoxFrom"]);
        double to = utilities.CalculateTime(Request.Form["tBoxTo"]);
        int userId = Convert.ToInt32(Request.Form["ddName"]);
        string message = Request.Form["inputMessage"];

        // Sätter upp vilka timmar som bokningen avser
        DateTime timeFrom = currentDate.AddHours(from);
        DateTime timeTo = currentDate.AddHours(to);

        // Skapar en bokning och lägger in detaljerna i newBookingDetails
        ScheduleUtilities.BookingDetails newBookingDetails = scheduleUtilities.AddBooking(currentDate, timeFrom, timeTo, roomId, userId, message);

        // Få rätt sida i redirect
        string addBookingRedirect = scheduleUtilities.GetReturnPage(newBookingDetails, currentDate, roomId);

        // Skicka ut mail om bokningen
        MailHandler.SendBookingMail(newBookingDetails);

        BookingHub.SendToAll(currentDate.ToString("yyyy-MM-dd"), roomId);

        Response.Redirect("Details.aspx" + addBookingRedirect + defaultRoom);
    }

}